home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / network / admin / xinetd.2 / xinetd / xinetd.2.1.7-linux.4 / libs / src / pset / pset.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-25  |  3.1 KB  |  123 lines

  1. /*
  2.  * (c) Copyright 1992, 1993 by Panagiotis Tsirigotis
  3.  * All rights reserved.  The file named COPYRIGHT specifies the terms 
  4.  * and conditions for redistribution.
  5.  */
  6.  
  7. #ifndef __PSET_H
  8. #define __PSET_H
  9.  
  10. /*
  11.  * $Id: pset.h,v 3.1 1993/03/06 18:50:18 panos Exp $
  12.  */
  13.  
  14. typedef void *__pset_pointer ;
  15.  
  16. struct __pset
  17. {
  18.     unsigned alloc_step ;
  19.     __pset_pointer *ptrs ;
  20.     unsigned max ;
  21.     unsigned count ;
  22. } ;
  23.  
  24.  
  25. /*
  26.  * INTERFACE
  27.  */
  28.  
  29. #ifdef __ARGS
  30. #undef __ARGS
  31. #endif
  32.  
  33. #ifdef PROTOTYPES
  34. #  define __ARGS( s )               s
  35. #else
  36. #  define __ARGS( s )               ()
  37. #endif
  38.  
  39. typedef struct __pset *pset_h ;
  40.  
  41. pset_h pset_create            __ARGS( ( unsigned start, unsigned step ) ) ;
  42. void pset_destroy                __ARGS( ( pset_h ) ) ;
  43.  
  44. __pset_pointer pset_insert __ARGS( ( pset_h, __pset_pointer ) ) ;
  45. void pset_delete                __ARGS( ( pset_h, __pset_pointer ) ) ;
  46.  
  47. void pset_compact             __ARGS( ( pset_h ) ) ;
  48. void pset_uniq                 __ARGS( ( pset_h, void (*func)(), void *arg ) ) ;
  49. void pset_apply                 __ARGS( ( pset_h, void (*func)(), void *arg ) ) ;
  50.  
  51. /*
  52.  * Macros
  53.  */
  54. #define pset_add( pset, ptr )                                               \
  55.       (                                                                 \
  56.          ( (pset)->count < (pset)->max )                                \
  57.             ? (pset)->ptrs[ (pset)->count++ ] = (__pset_pointer) ptr    \
  58.             : pset_insert( (pset), (__pset_pointer) ptr )                    \
  59.       )
  60.  
  61. #define pset_remove( pset, ptr )            pset_delete( pset, (__pset_pointer)ptr )
  62.  
  63. #define pset_remove_index( pset, i )                                                \
  64.         {                                                                                        \
  65.             if ( (i) < (pset)->count )                                                    \
  66.                  (pset)->ptrs[ i ] = (pset)->ptrs[ --(pset)->count ] ;        \
  67.         }
  68.  
  69. #define pset_clear( pset )                (pset)->count = 0
  70. #define pset_count( pset )                (pset)->count
  71. #define pset_pointer( pset, i )        (pset)->ptrs[ i ]
  72.  
  73. #define pset_sort( pset, compfunc )                                                    \
  74.         (void) qsort( (char *) &pset_pointer( pset, 0 ),                        \
  75.                 pset_count( pset ), sizeof( __pset_pointer ), compfunc )
  76.  
  77. /*
  78.  * PSET iterators
  79.  * 
  80.  * Note that the iterators do NOT use any knowledge about the internals
  81.  * of pset's.
  82.  */
  83. struct __pset_iterator
  84. {
  85.     pset_h pset ;
  86.     unsigned current ;
  87.     int step ;
  88. } ;
  89.  
  90. typedef struct __pset_iterator *psi_h ;
  91.  
  92.  
  93. #define __psi_current( iter )                                                            \
  94.                         ( (iter)->current < pset_count( (iter)->pset )            \
  95.                             ? pset_pointer( (iter)->pset, (iter)->current )        \
  96.                             : NULL )
  97.  
  98. #define psi_start( iter )                                                            \
  99.                     ( (iter)->current = 0, (iter)->step = 1,                        \
  100.                     __psi_current( iter ) )
  101.  
  102. #define psi_next( iter )                                                             \
  103.                     ( (iter)->current += (iter)->step, (iter)->step = 1,        \
  104.                     __psi_current( iter ) )
  105.  
  106. #define psi_remove( iter )                                                            \
  107.                 {                                                                                \
  108.                     if ( (iter)->current < pset_count( (iter)->pset ) )        \
  109.                     {                                                                            \
  110.                         pset_remove_index( (iter)->pset, (iter)->current ) ;    \
  111.                         (iter)->step = 0 ;                                                \
  112.                     }                                                                            \
  113.                 }
  114.  
  115. #define psi_reset( iter, newpset )        (iter)->pset = (newpset)
  116.  
  117. #define psi_destroy( iter )                free( (char *) iter )
  118.  
  119. psi_h psi_create __ARGS( ( pset_h ) ) ;
  120.  
  121. #endif    /* __PSET_H */
  122.  
  123.